package org.jflame.context.ratelimiter;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import org.jflame.context.spring.aop.KeyExprParseContext;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

@Documented
@Retention(RUNTIME)
@Target({ METHOD })
public @interface RequestRate {

    /**
     * 限流方法的唯一名称(可以是表达式),表达式解析:
     * <p>
     * 1. #{xxx},视为spel表达式,可从方法参数中获取数据 <br>
     * 2. xxx, 固定字符串 <br>
     * 3. 为空,使用方法签名字符串<br>
     * 4. 其他特定格式，由注入的解析器决定
     * 
     * @see KeyExprParseContext
     * @return
     */
    String key();

    /**
     * 阀值
     * 
     * @return
     */
    int threshold();

    /**
     * 时间间隔,默认1
     * 
     * @return
     */
    int interval()

    default 1;

    /**
     * 时间间隔单位,默认分钟
     * 
     * @return
     */
    TimeUnit timeUnit() default TimeUnit.MINUTES;

}
